package com.woniuxy.service.impl;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.woniuxy.dao.OrderDao;
import com.woniuxy.entity.Coach;
import com.woniuxy.entity.Order;
import com.woniuxy.entity.PageBean;
import com.woniuxy.entity.PrivateInfo;
import com.woniuxy.entity.Temporary;
import com.woniuxy.entity.User;
import com.woniuxy.service.CoachService;
import com.woniuxy.service.OrderService;
import com.woniuxy.service.PrivateInfoService;
import com.woniuxy.service.TemporaryService;
import com.woniuxy.service.UserService;
import com.woniuxy.utils.TimeUtils;
import org.springframework.transaction.annotation.Transactional;


/**
 * 订单service实现类
 * <p>
 * Title: OrderServiceImpl
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author 王敞 365799712@qq.com
 * @date 2020年6月14日
 */
@Transactional
@Service
public class OrderServiceImpl implements OrderService {
	@Autowired
	private PrivateInfoService privateInfoService;
	@Autowired
	private OrderDao orderDao;
	@Autowired
	private TemporaryService temporaryService;
	@Autowired
	private CoachService coachService;
	@Autowired
	private UserService userService;

	/**
	 * 教练确认约私教
	 * 
	 * @param pid
	 * @return
	 * @author 王敞
	 */
	@Override
	public int addOrder(int pid) {
		// 先判断该约私教通知是否为已过期的
		PrivateInfo info = privateInfoService.findPrivateInfoBypid(pid);
		if (info.getPstatus().equals("0")) {

			return 0;// 返回值为0，表示该私教通知已过期
		}
		// 在判断此通知是否为最新的
		PrivateInfo info2 = privateInfoService.findLastPrivateInfosByUidAndCid(info.getUid(), info.getCid());
		if (info.getPid() != info2.getPid()) {
			// 表示已有过处理
			return -1;// -1 表示该私教通知已经处理过了，无需再处理

		}
		// 都没问题执行增加订单操作
		// 设置订单编码
		String code = "WNJS" + TimeUtils.getNowTimeyyyyMMddHHmmss();
		Order order = new Order();
		order.setOstatus("1");
		order.setCid(info.getCid());
		order.setUid(info.getUid());
		order.setOrderNumber(code);
		order.setOrderTime(TimeUtils.getNowTime());
		// 新增订单
		orderDao.addOrder(order);
		// 通过订单编号返回该订单，私教通知绑定该订单编码。
		order = orderDao.findOrderByorderNumber(order.getOrderNumber());
		// 通过pid获取记账记录，将订单id绑定上去
		Temporary temporary = temporaryService.findTemporaryByPid(pid);
		temporary.setOid(order.getOid());
		temporaryService.updateTemporayOid(temporary);
		// 新增一条约私教通知，其状态为2 ，表明教练确认此次约私教
		PrivateInfo privateInfo = new PrivateInfo();
		privateInfo.setInfoTime(TimeUtils.getNowTime()).setCid(info.getCid()).setOrderNumber(order.getOrderNumber())
				.setPstatus("2").setUid(info.getUid());
		privateInfoService.addPrivateinfo2(privateInfo);
		return 1;// 表示教练确认约课成功
	}

	/**
	 * 通过教练id分页查询相关的订单订单消息
	 * 
	 * @param cid
	 * @return
	 * @author 王敞
	 */
	@Override
	public PageBean<Order> findOrdersByCid(int page, int pageSize, int cid) {
		PageBean<Order> pb = new PageBean<Order>();
		int index = (page - 1) * pageSize;
		List<Order> orders = orderDao.findOrdersByCid(index, pageSize, cid);
		int totalNums = orderDao.findTotalNumsOfOrdersByCid(cid);
		int totalPage = totalNums % pageSize == 0 ? totalNums / pageSize : totalNums / pageSize + 1;
		pb.setData(orders).setNumsOfCurrPage(orders.size()).setPage(page).setPageSize(pageSize).setTotalNum(totalNums)
				.setTotalPage(totalPage);
		return pb;

	}

	/**
	 * 教练结课
	 * 
	 * @param oid
	 * @return
	 * @author 王敞
	 */
	@Override
	public int endClass(int oid) {
		// 先通过订单id获取此订单信息
		Order order = orderDao.findOrderByOid(oid);
		// 将订单状态设置成2，表示已结课。对教练来说已结课，对学生来说代付款
		order.setOstatus("2");
		// 新增一条类型为5，表示教练已结课的通知的约私教通知
		PrivateInfo info = new PrivateInfo();
		info.setPstatus("5");
		info.setCid(order.getCid());
		info.setUid(order.getUid());
		info.setInfoTime(TimeUtils.getNowTime());
		info.setOrderNumber(order.getOrderNumber());
		privateInfoService.addPrivateinfo2(info);
		// 修改订单状态
		return orderDao.updateOrderOstatus(order.getOstatus(), order.getOid());
	}

	/**
	 * 学生确认付款
	 * 
	 * @param oid
	 * @return
	 * @author 王敞
	 */
	@Override
	public int confirmsPayment(int oid) {
		// 通过订单id查询该订单
		Order order = orderDao.findOrderByOid(oid);
		// 修改订单状态为已付款
		orderDao.updateOrderOstatus("3", oid);
		// 新增一条状态为6，表示学生已付款的约私教通知
		PrivateInfo info = new PrivateInfo();
		info.setCid(order.getCid());
		info.setInfoTime(TimeUtils.getNowTime());
		info.setOrderNumber(order.getOrderNumber());
		info.setPstatus("6");
		info.setUid(order.getUid());
		privateInfoService.addPrivateinfo2(info);
		// 将暂存表中的押金转给教练
		Temporary temporary = temporaryService.findTemporaryByOid(oid);
		Coach coach = coachService.findCoachByCid(order.getCid());
		BigDecimal money = coach.getMoney().add(temporary.getMoney());
		coach.setMoney(money);
		coachService.updateOrderMoneyByOrder(coach);
		// 将暂存表状态设置为3，表示已完成
		temporaryService.updateTemporaryTstatus(temporary.getTid(), "3");
		return 1;
	}

	/**
	 * 教练拒绝通知请求
	 * 
	 * @param pid
	 * @return
	 * @author 王敞
	 */
	@Override
	public int refusePrvateInfo(int pid) {
		// 先通过pid获取该通知
		PrivateInfo info = privateInfoService.findPrivateInfoBypid(pid);

		if (info.getPstatus().equals("0")) {
			return 0;// 返回值为0，表示该私教通知已过期
		}
		// 在判断该私教通知是否为已经处理过了
		// 获取最新的私教通知，比较最新通知的id与此约私教通知的id
		PrivateInfo info2 = privateInfoService.findLastPrivateInfosByUidAndCid(info.getUid(), info.getCid());
		if (info.getPid() != info2.getPid()) {
			// 表示已有过处理
			return -1;// -1 表示该私教通知已经处理过了，无需再处理

		}
		// 将钱归还给学员

		Temporary temporary = temporaryService.findTemporaryByPid(info.getPid());
		BigDecimal money = temporary.getMoney();
		userService.updateUserMoney(info.getUid(), money);
		// 新增一条通知其状态为3，表示教练已经拒绝了此次约课
		PrivateInfo info3 = new PrivateInfo();
		info3.setInfoTime(TimeUtils.getNowTime());
		info3.setCid(info.getCid());
		info3.setPstatus("3");
		info3.setUid(info.getUid());
		privateInfoService.addPrivateinfo2(info3);

		return 1;// 表示教练拒绝约私教成功

	}

	/**
	 * 分页查询学员相关的订单数据
	 * 
	 * @param uid
	 * @return
	 * @author 王敞
	 */
	@Override
	public PageBean<Order> findOrdersByUid(int page, int pageSize, int uid) {
		PageBean<Order> pb = new PageBean<Order>();
		int index = (page - 1) * pageSize;
		List<Order> orders = orderDao.findOrdersByUid(index, pageSize, uid);
		int totalNums = orderDao.findTotalNumsOfOrdersByUid(uid);
		int totalPage = totalNums % pageSize == 0 ? totalNums / pageSize : totalNums / pageSize + 1;
		pb.setData(orders).setNumsOfCurrPage(orders.size()).setPage(page).setPageSize(pageSize).setTotalNum(totalNums)
				.setTotalPage(totalPage);
		return pb;
	}
	
	
	@Override
	public int addRemarkByOid(Order order) {
		orderDao.updateOrderOstatus("4", order.getOid());
		return orderDao.addRemarkByOid(order);
	}

	/**
	 * 通过学员id查询该学员所有订单总数
	 * 
	 * @param uid
	 * @return
	 */
	@Override
	public int findOrderCountByUid(int uid) {
		return orderDao.findOrderCountByUid(uid);
	}

	/**
	 * 查询好评数
	 */
	@Override
	public int findNiceOrderCountByUid(int uid) {
		return orderDao.findNiceOrderCountByUid(uid);
	}

	/**
	 * 查询中评数
	 */
	@Override
	public int findComOrderCountByUid(int uid) {
		return orderDao.findComOrderCountByUid(uid);
	}

	/**
	 * 查询差评数
	 * 
	 * @param uid
	 * @return
	 */
	@Override
	public int findBadOrderCountByUid(int uid) {
		return orderDao.findBadOrderCountByUid(uid);
	}

}
